{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from random import random, choice\n",
    "from core import Agent\n",
    "from gym import Env\n",
    "import gym\n",
    "from gridworld import WindyGridWorld, SimpleGridWorld\n",
    "from utils import str_key, set_dict, get_dict\n",
    "from utils import epsilon_greedy_pi, epsilon_greedy_policy\n",
    "from utils import greedy_policy, learning_curve"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class QAgent(Agent):\n",
    "    def __init__(self, env:Env, capacity:int = 20000):\n",
    "        super(QAgent, self).__init__(env, capacity)\n",
    "        self.Q = {}\n",
    "\n",
    "    def policy(self, A, s, Q, epsilon):\n",
    "        return epsilon_greedy_policy(A, s, Q, epsilon)\n",
    "    \n",
    "    def learning_method(self, gamma = 0.9, alpha = 0.1, epsilon = 1e-5, display = False, lambda_ = None):\n",
    "        self.state = self.env.reset()\n",
    "        s0 = self.state\n",
    "        if display:\n",
    "            self.env.render()\n",
    "        # a0 = self.perform_policy(s0, epsilon)\n",
    "\n",
    "        time_in_episode, total_reward = 0, 0\n",
    "        is_done = False\n",
    "        while not is_done:\n",
    "            # add code here\n",
    "            self.policy = epsilon_greedy_policy\n",
    "            a0 = self.perform_policy(s0, self.Q, epsilon)\n",
    "            s1, r1, is_done, info, total_reward = self.act(a0)\n",
    "            if display:\n",
    "                self.env.render()\n",
    "            self.policy = greedy_policy\n",
    "            a1 = greedy_policy(self.A, s1, self.Q)\n",
    "            old_q = get_dict(self.Q, s0, a0)\n",
    "            q_prime = get_dict(self.Q, s1, a1)\n",
    "            td_target = r1 + gamma * q_prime\n",
    "            #alpha = alpha / num_episode\n",
    "            new_q = old_q + alpha * (td_target - old_q)\n",
    "            set_dict(self.Q, new_q, s0, a0)\n",
    "            # s0, a0 = s1, a1\n",
    "            s0 = s1\n",
    "            time_in_episode += 1\n",
    "        if display:\n",
    "            print(self.experience.last_episode)\n",
    "        return time_in_episode, total_reward    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 800/800 [00:00<00:00, 1480.73it/s]\n"
     ]
    }
   ],
   "source": [
    "env = WindyGridWorld()\n",
    "agent = QAgent(env)\n",
    "\n",
    "data = agent.learning(gamma = 1.0, \n",
    "                            epsilon = 0.1,\n",
    "                            decaying_epsilon = True,\n",
    "                            alpha = 0.5, \n",
    "                            max_episode_num = 800, \n",
    "                            display = False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100/100 [00:00<00:00, 1629.15it/s]\n"
     ]
    }
   ],
   "source": [
    "agent.learning_method(epsilon = 0.01, display = False)\n",
    "data = agent.learning(gamma = 1.0, display = False, max_episode_num = 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learning_curve(data, x_index = 0, y1_index = 2, y2_index = None,\n",
    "               title=\"Q learning curve\", x_name = \"time step num\", y_name = \"episode num\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "env.reset()\n",
    "env.render()\n",
    "#agent.learning(display = True, max_episode_num = 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "env.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
